package fr.uniscol.siecle.readers;

import java.util.ArrayList;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.filter.Filters;
import org.jdom2.xpath.XPathExpression;
import org.jdom2.xpath.XPathFactory;

import fr.uniscol.siecle.model.Civilite;
import fr.uniscol.siecle.model.Division;
import fr.uniscol.siecle.model.Enseignant;
import fr.uniscol.siecle.model.FichierExportSTSWeb;
import fr.uniscol.siecle.model.FichierExportSiecle;
import fr.uniscol.siecle.model.FichierExportSiecleGeographie;
import fr.uniscol.siecle.model.Groupe;
import fr.uniscol.siecle.model.MEF;
import fr.uniscol.siecle.model.Matiere;
import fr.uniscol.siecle.model.ModaliteCours;
import fr.uniscol.siecle.model.Programme;
import fr.uniscol.siecle.model.Service;
import fr.uniscol.siecle.model.ServiceEnseignant;
import fr.uniscol.siecle.model.UAJ;

public class FichierSIECLESTSReader extends FichierSIECLEReader {
	
	public FichierExportSiecle readFromDOM(Document dom) {
		
		FichierExportSTSWeb sts = new FichierExportSTSWeb();
		
		sts.readParametresFromDOM(dom);
		
		// UAI
		Element eUAJ = dom.getRootElement().getChild("PARAMETRES").getChild("UAJ");
		if(eUAJ != null){
			UAJ uaj = new UAJ(eUAJ.getAttributeValue("CODE"));
			sts.setUaj(uaj);
		}
		
		XPathExpression<Element> xp = XPathFactory.instance().compile("//NOMENCLATURES/CIVILITES/CIVILITE", Filters.element());
		
		// Nomenclatures
		Civilite civ = null;
		ModaliteCours mc = null;
		Matiere mat = null;
		MEF mef = null;
		Programme pr = null;
		
		List<Element> elems = xp.evaluate(dom);
		for(Element e : elems){
			civ = new Civilite(e.getAttributeValue("CODE"), e.getChildText("LIBELLE_COURT"), e.getChildText("LIBELLE_LONG"));
			sts.getCivilites().add(civ);
		}
		
		xp = XPathFactory.instance().compile("//NOMENCLATURES/MODS_COURS/MOD_COURS", Filters.element());
		elems = xp.evaluate(dom);
		for(Element e : elems){
			mc = new ModaliteCours(e.getAttributeValue("CODE"), e.getChildText("LIBELLE_COURT"), e.getChildText("LIBELLE_LONG"));
			sts.getModalites().add(mc);
		}
		
		xp = XPathFactory.instance().compile("//NOMENCLATURES/MATIERES/MATIERE", Filters.element());
		elems = xp.evaluate(dom);
		for(Element e : elems){
			mat = new Matiere();
			mat.setCode(e.getAttributeValue("CODE"));
			mat.setCodeGestion(e.getChildText("CODE_GESTION"));
			mat.setLibelleCourt(e.getChildText("LIBELLE_COURT"));
			mat.setLibelleLong(e.getChildText("LIBELLE_LONG"));
			mat.setLibelleEdition(e.getChildText("LIBELLE_EDITION"));
			sts.getMatieres().add(mat);
		}
		
		xp = XPathFactory.instance().compile("//NOMENCLATURES/MEFS/MEF", Filters.element());
		elems = xp.evaluate(dom);
		for(Element e : elems){
			mef = new MEF(e.getAttributeValue("CODE"));
			mef.setFormation(e.getChildText("FORMATION"));
			mef.setSpecialite(e.getChildText("SPECIALITE"));
			mef.setLibelleEdition(e.getChildText("LIBELLE_EDITION"));
			mef.setLibelleLong(e.getChildText("LIBELLE_LONG"));
			sts.getMefs().add(mef);
		}
		
		xp = XPathFactory.instance().compile("//PROGRAMMES/PROGRAMME", Filters.element());
		elems = xp.evaluate(dom);
		for(Element e : elems){
			mef = sts.getMEF(e.getChildText("CODE_MEF"));
			mat = sts.getMatiere(e.getChildText("CODE_MATIERE"));
			
			if(mef != null && mat != null){
				pr = new Programme(mef, mat, null);
				pr.setHoraire(Float.parseFloat(e.getChildText("HORAIRE")));
				sts.getProgrammes().add(pr);
			}
		}
		
		// Enseignants
		xp = XPathFactory.instance().compile("//DONNEES/INDIVIDUS/INDIVIDU", Filters.element());
		
		List<Enseignant> enseignants = new ArrayList<Enseignant>();
		Enseignant ens = null;
		
		List<Element> eIndivs = xp.evaluate(dom);
		for(Element eIndi : eIndivs){
			ens = new Enseignant();
			civ = sts.getCivilite(eIndi.getChildText("CIVILITE"));
			ens.setCivilite(civ);
			ens.setUaj(sts.getUaj());
			
			ens.setId(eIndi.getAttributeValue("ID"));
			ens.setNom(eIndi.getChildText("NOM_USAGE"));
			ens.setNomPatronyme(eIndi.getChildText("NOM_PATRONYMIQUE"));
			ens.setPrenom(eIndi.getChildText("PRENOM"));
			ens.setDateNaissance(eIndi.getChildText("DATE_NAISSANCE"));
			ens.setFonction(eIndi.getChildText("FONCTION"));
			ens.setGrade(eIndi.getChildText("GRADE"));
			ens.setSexe(eIndi.getChildText("SEXE"));
			
			enseignants.add(ens);
		}
		
		sts.setEnseignants(enseignants);
		
		// Structures
		List<Division> divisions = new ArrayList<Division>();
		Division div = null;
		
		xp = XPathFactory.instance().compile("//DONNEES/STRUCTURE/DIVISIONS/DIVISION", Filters.element());
		List<Element> eStructures = xp.evaluate(dom);
		List<Element> eServices = null;
		XPathExpression<Element> xps = null;
		
		Service service = null;
		ServiceEnseignant serviceEns = null;
		
		Element eEnseignants = null;
		Element eEns = null;
		
		for(Element st : eStructures){
			div = new Division();
			div.setCode(st.getAttributeValue("CODE"));
			div.setLibelleLong(st.getChildText("LIBELLE_LONG"));
			divisions.add(div);
			
			// TODO : MES APPARTENANCES
			
			// Services
			xps = XPathFactory.instance().compile("//DONNEES/STRUCTURE/DIVISIONS/DIVISION[@CODE='" + div.getCode() + "']/SERVICES/SERVICE", Filters.element());
			eServices = xps.evaluate(dom);
			for(Element es : eServices){
				mat = sts.getMatiere(es.getAttributeValue("CODE_MATIERE"));
				mc = sts.getModalite(es.getAttributeValue("CODE_MOD_COURS"));
				
				service = new Service(div, mat, mc);
				service.setHeureStructure(Float.parseFloat(es.getChildText("HEURES_STRUCTURE")));
				service.setCoEnseignement(Boolean.parseBoolean(es.getChildText("CO_ENS")));
				service.setType("CL");
				
				eEnseignants = es.getChild("ENSEIGNANTS");
				if(eEnseignants != null){
					for(Element e : eEnseignants.getChildren()){
						ens = sts.getEnseignant(e.getAttributeValue("ID"));
						if(ens != null){
							serviceEns = new ServiceEnseignant(ens, Float.parseFloat(e.getChildText("HEURES_AGENT")));
							serviceEns.setService(service);
							service.getServicesEnseignant().add(serviceEns);
						}
					}
				}
				
				sts.getServices().add(service);
			}
		}
		sts.setDivisions(divisions);
		
		// Groupes
		Groupe g = null;
		xp = XPathFactory.instance().compile("//DONNEES/STRUCTURE/GROUPES/GROUPE", Filters.element());
		List<Element> eGroupes = xp.evaluate(dom);
		for(Element eGrp : eGroupes){
			g = new Groupe(eGrp.getAttributeValue("CODE"), "", eGrp.getChildText("LIBELLE_LONG"));
			
			// TODO : Divisions appartenances
			
			// TODO : MEFS appartenances
			
			eServices = eGrp.getChild("SERVICES").getChildren();
			for(Element eService : eServices){
				mat = sts.getMatiere(eService.getAttributeValue("CODE_MATIERE"));
				mc = sts.getModalite(eService.getAttributeValue("CODE_MOD_COURS"));
				
				service = new Service(g, mat, mc);
				service.setHeureStructure(Float.parseFloat(eService.getChildText("HEURES_STRUCTURE")));
				service.setCoEnseignement(Boolean.parseBoolean(eService.getChildText("CO_ENS")));
				service.setType("GP");
				
				eEnseignants = eService.getChild("ENSEIGNANTS");
				if(eEnseignants != null){
					for(Element e : eEnseignants.getChildren()){
						ens = sts.getEnseignant(e.getAttributeValue("ID"));
						if(ens != null){
							serviceEns = new ServiceEnseignant(ens, Float.parseFloat(e.getChildText("HEURES_AGENT")));
							serviceEns.setService(service);
							service.getServicesEnseignant().add(serviceEns);
						}
					}
				}
				
				sts.getServices().add(service);
			}
			
			sts.getGroupes().add(g);
		}
		
		return sts;
	}
}
